;Programmable [LCD 2x16 (8 bit)] /*------------------------------------------------------------------------ -******************* (Internal EEPROM Data Memory) *********************- ------------------------------------------------------------------------- The ATmega16 Contains -(512 bytes)- of Data EEPROM Memory -----------------------------------------------------------------------*/ .NOLIST ;Disable listfile generation(Combination) .include "m16def.inc" ;Read source from another file .LIST ;Reenable listfile generation on ;......................................................................... ;.......................... define ports in/out .......................... ;......................................................................... ; PortA ------------------------------------------------------------------ .equ DataOut =PORTA ;Output and Pull-Up-PortA Output= Data .equ DataDdr =DDRA ;Data direction register of the PortA ; PortB 7Segm - Output --------------------------------------------------- .equ LCD_RS =0 ;bit in I/O register PORTB.0 .equ LCD_RW =1 ;bit in I/O register PORTB.1 .equ LCD_E =2 ;bit in I/O register PORTB.2 ;------------------------------------------------------------------------- ;-*************** ( Define Ports Local Pointer Variable ) ***************- ;------------------------------------------------------------------------- ; Define Addres Clock .................................................... .equ TWI_BIT_RATE =0x02 ;Value of the TWI Bit Rate Register=50KHz .equ TWI_PRESCALER =0x03 ;Prescaler Vorteiler: [0=1 1=4 2=16 3=64] .equ Multimeter_WR =0xD0 ;Value of the Multimeter_Write = D0 hex .equ Multimeter_RE =0xD1 ;Value of the Multimeter_Ready = D1 hex .equ Add_Memory_S1 =0xA1 ;Value of the Add_Memory_S1 = A1 hex .equ Add_Memory_S2 =0xA2 ;Value of the Add_Memory_S2 = A2 hex .equ Add_Memory_S3 =0xA3 ;Value of the Add_Memory_S2 = A3 hex .equ Add_Memory_S4 =0xA4 ;Value of the Add_Memory_S2 = A4 hex ;------------------------------------------------------------------------- ;-************* ( Define Register Local Pointer Variable ) **************- ;------------------------------------------------------------------------- .def SegMemory_1 =R7 ;define a storage for 7Segment_Memory_1 .def SegMemory_2 =R8 ;define a storage for 7Segment_Memory_2 .def SegMemory_3 =R9 ;define a storage for 7Segment_Memory_3 .def SegMemory_4 =R10 ;define a storage for 7Segment_Memory_4 .def Var=R16 ;define a storage for variable .def Temp1 =R17 ;define a storage for Temporary 1 .def Temp2 =R18 ;define a storage for Temporary 2 .def Data_Addres =R22 ;define a storage for Data_Addres .def TWI_Memory =R23 ;define a storage for TWI_Memory ;---------------------------**** START ****------------------------------- START: .ORG 0000 ;---------------------------**** MACRO ****------------------------------- .LISTMAC .MACRO Stack Pointer ;Define an macro [Stack Pointer] LDI Var,0x00 ;Load Immediate register R16-00 hex OUT SPL,Var ;Stack Pointer Low 00 hex LDI Var,0x01 ;Load Immediate register R16-01 hex OUT SPH,Var ;Stack Pointer High 01 hex .ENDMACRO ;End macro definition ;------------------------------------------------------------------------- ;-**************** (Program Subroutine [ADC_Voltmeter] ) ****************- ;------------------------------------------------------------------------- Main: CLR R0 ;Load Immediate register R0 =00 hex CLR R1 ;Load Immediate register R1 =00 hex CLR R2 ;Load Immediate register R2 =00 hex CLR R3 ;Load Immediate register R3 =00 hex CLR R4 ;Load Immediate register R4 =00 hex CLR R5 ;Load Immediate register R5 =00 hex CLR R6 ;Load Immediate register R6 =00 hex CLR SegMemory_1 ;Load Immediate register R7 =00 hex CLR SegMemory_2 ;Load Immediate register R8 =00 hex CLR SegMemory_3 ;Load Immediate register R9 =00 hex CLR SegMemory_4 ;Load Immediate register R10 =00 hex CLR Var ;Load Immediate register R16 =00 hex CLR Temp1 ;Load Immediate register R17 =00 hex CLR Temp2 ;Load Immediate register R18 =00 hex CLR Data_Addres ;Load Immediate register R22 =00 hex CLR TWI_Memory ;Load Immediate register R23 =00 hex LDI Var,0xFF ;Load Immediate register R16=FF hex OUT DataDdr,Var ;Make DDRA For Output= FF hex OUT DDRB,Var ;Make DDRB For Output= FF hex CBI PORTB,LCD_RS ;Clear bit in I/O register PORTB.0 CBI PORTB,LCD_RW ;Clear bit in I/O register PORTB.1 CBI PORTB,LCD_E ;Clear bit in I/O register PORTB.2 /*------------------------------------------------------------------------ -*************** (Program Subroutine LCD 2x16 (8 bit)) *****************- ------------------------------------------------------------------------- Subroutine [LCD 2x16 (8 bit)] -----------------------------------------------------------------------*/ Stack Pointer ;Call macro, show [Stack Pointer] ; Description: Init LCD lines2 5*7 Matrix LDI Var,0x38 ;Load Immediate register R16=38 hex RCALL Command_LCD ;Call Subroutine Command_LCD RCALL Delay_5ms ;Call Subroutine Delay_5ms ; Description: Clears Display and returns cursor to the Home Position LDI Var,0x01 ;Load Immediate register R16=01 hex RCALL Command_LCD ;Call Subroutine Command_LCD RCALL Delay_5ms ;Call Subroutine Delay_5ms ; Description: Display On Cursor LCD ( | ) LDI Var,0x0E ;Load Immediate register R16=0E hex RCALL Command_LCD ;Call Subroutine Command_LCD RCALL Delay_5ms ;Call Subroutine Delay_5ms ; Description: Command cursor shift >> right LDI Var,0x06 ;Load Immediate register R16=06 hex RCALL Command_LCD ;Call Subroutine Command_LCD RCALL Delay_5ms ;Call Subroutine Delay_5ms ; Description: Command Cursor to ( Line 1 ) pos1 LDI Var,0x80 ;Load Immediate register R16=80 hex RCALL Command_LCD ;Call Subroutine Command_LCD RCALL Delay_5ms ;Call Subroutine Delay_5ms ; Description: Display Word H LDI Var,'H' ;Load Immediate register Word RCALL Data_LCD ;Call Subroutine Data_LCD RCALL Delay_5ms ;Call Subroutine Delay_5ms ; Description: Command cursor shift >> right LDI Var,0x06 ;Load Immediate register R16=06 hex RCALL Command_LCD ;Call Subroutine Command_LCD RCALL Delay_5ms ;Call Subroutine Delay_5ms ; Description: Display Word e LDI Var,'e' ;Load Immediate register Word RCALL Data_LCD ;Call Subroutine Data_LCD RCALL Delay_5ms ;Call Subroutine Delay_5ms ; Description: Command cursor shift >> right LDI Var,0x06 ;Load Immediate register R16=06 hex RCALL Command_LCD ;Call Subroutine Command_LCD RCALL Delay_5ms ;Call Subroutine Delay_5ms ; Description: Display Word l LDI Var,'l' ;Load Immediate register Word RCALL Data_LCD ;Call Subroutine Data_LCD RCALL Delay_5ms ;Call Subroutine Delay_5ms ; Description: Command cursor shift >> right LDI Var,0x06 ;Load Immediate register R16=06 hex RCALL Command_LCD ;Call Subroutine Command_LCD RCALL Delay_5ms ;Call Subroutine Delay_5ms ; Description: Display Word l LDI Var,'l' ;Load Immediate register Word RCALL Data_LCD ;Call Subroutine Data_LCD RCALL Delay_5ms ;Call Subroutine Delay_5ms ; Description: Command cursor shift >> right LDI Var,0x06 ;Load Immediate register R16=06 hex RCALL Command_LCD ;Call Subroutine Command_LCD RCALL Delay_5ms ;Call Subroutine Delay_5ms ; Description: Display Word o LDI Var,'o' ;Load Immediate register Word RCALL Data_LCD ;Call Subroutine Data_LCD RCALL Delay_5ms ;Call Subroutine Delay_5ms ; Description: Command Cursor to ( Line 2 ) pos2 LDI Var,0xC1 ;Load Immediate register R16=C1 hex RCALL Command_LCD ;Call Subroutine Command_LCD RCALL Delay_5ms ;Call Subroutine Delay_5ms ; Description: Display Word A LDI Var,'A' ;Load Immediate register Word RCALL Data_LCD ;Call Subroutine Data_LCD RCALL Delay_5ms ;Call Subroutine Delay_5ms ; Description: Command cursor shift >> right LDI Var,0x06 ;Load Immediate register R16=06 hex RCALL Command_LCD ;Call Subroutine Command_LCD RCALL Delay_5ms ;Call Subroutine Delay_5ms ; Description: Display Word V LDI Var,'V' ;Load Immediate register Word RCALL Data_LCD ;Call Subroutine Data_LCD RCALL Delay_5ms ;Call Subroutine Delay_5ms ; Description: Command cursor shift >> right LDI Var,0x06 ;Load Immediate register R16=06 hex RCALL Command_LCD ;Call Subroutine Command_LCD RCALL Delay_5ms ;Call Subroutine Delay_5ms ; Description: Display Word R LDI Var,'R' ;Load Immediate register Word RCALL Data_LCD ;Call Subroutine Data_LCD RCALL Delay_5ms ;Call Subroutine Delay_5ms ; Description: Command Cursor OFF LDI Var,0x0C ;Load Immediate register R16=0C hex RCALL Command_LCD ;Call Subroutine Command_LCD RCALL Delay_5ms ;Call Subroutine Delay_5ms STOP: RJMP STOP /*------------------------------------------------------------------------ -********************** ( Send Command to LCD ) ************************- ------------------------------------------------------------------------- Subroutine Send Command to LCD Comment: 1- Pin RS = 0 2- Data Command => PORTA Output ___ ___ 3- Puls E = 1/0 E ___/ \___/ \___ -----------------------------------------------------------------------*/ Command_LCD: CBI PORTB,LCD_RS ;Clear bit in I/O register PORTB.0 OUT DataOut,Var ;Make PORTA For Output <- R16 CBI PORTB,LCD_RW ;Clear bit in I/O register PORTB.1 SBI PORTB,LCD_E ;Set bit in I/O register PORTB.2 ;Delay_450ns NOP ; 8Mhz / 8 = 1us -> 1000 ns CBI PORTB,LCD_E ;Clear bit in I/O register PORTB.2 RET ;Subroutine Return /*------------------------------------------------------------------------ -************************ ( Send Data to LCD ) *************************- ------------------------------------------------------------------------- Subroutine Send Data to LCD Comment: 1- Pin RS = 1 2- Data => PORTA Output ___ ___ 3- Puls E = 1/0 E ___/ \___/ \___ -----------------------------------------------------------------------*/ Data_LCD: SBI PORTB,LCD_RS ;Set bit in I/O register PORTB.0 OUT DataOut,Var ;Make PORTA For Output <- R16 CBI PORTB,LCD_RW ;Clear bit in I/O register PORTB.1 SBI PORTB,LCD_E ;Set bit in I/O register PORTB.2 ;Delay_450ns NOP ; 8Mhz / 8 = 1us -> 1000 ns CBI PORTB,LCD_E ;Clear bit in I/O register PORTB.2 RET ;Subroutine Return /*------------------------------------------------------------------------ -************************ (Give Some Time 5ms) *************************- ------------------------------------------------------------------------- Time reference Give Some Time 5ms Comment: TCCR0 = 0000 0011 ClkI/O/64 (From prescaler) 8MHz / 64 = 0.125MHz T = 1/0.125MHz = 8 us Clocks => 1+1+1+1+1+0+2+1+1+4+3 = 16 => 8Mhz / 8 = 1us => 16us T+Clocks = 8+16 = 24us Delay 5.376ms = 5.376ms/24us >> 5376ms/24 = 224 ~= 224 TCNT0 = ? >>> 256-224 = 32 >>> hex >>>20 -----------------------------------------------------------------------*/ Delay_5ms: LDI Temp1,0x03 ;Load Immediate register R17=03 hex C->1 OUT TCCR0,Temp1 ;Timer/Counter0 Control Frequency=64 C->1 LDI Temp2,0x20 ;Load Immediate register R18=20 hex C->1 OUT TCNT0,Temp2 ;Timer/Counter(8 Bits)=EC hex C->1 ;TCCR0=010 ClkI/O/8 (From prescaler) Loop_5ms: IN Var,TIFR ;Timer/Counter Interrupt FlagRegister C->1 SBRS Var,TOV0 ;Skip if Bit in Registeris Set TOV0=1 C->0 RJMP Loop_5ms ;Jump to 1ms C->2 LDI Var,0xFF ;Load Immediate register R16=FF hex C->1 OUT TIFR,Var ;Clear Interrupt FlagRegister C->1 RET ;Subroutine Return C->4